/*
GanttProject is an opensource project management tool. License: GPL3
Copyright (C) 2011 GanttProject Team

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/
package org.ganttproject.impex.htmlpdf.itext;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;

import org.ganttproject.impex.htmlpdf.fonts.TTFontCache;

import com.itextpdf.text.Document;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;

import net.sourceforge.ganttproject.GanttExportSettings;
import net.sourceforge.ganttproject.chart.ChartModel;
import net.sourceforge.ganttproject.chart.TimelineChart;
import net.sourceforge.ganttproject.chart.export.ChartDimensions;
import net.sourceforge.ganttproject.chart.export.ChartImageVisitor;

/**
 * Provides functions for writing charts to PDF writer.
 *
 * @author dbarashev (Dmitry Barashev)
 */
class ChartWriter implements ChartImageVisitor {
    private final Document myDoc;
    private final TimelineChart myChart;
    private final GanttExportSettings myExportSettings;
    private final PdfWriter myWriter;
    private final TTFontCache myFontCache;

    private float myScale;
    private float myYShift;
    private PdfTemplate myTemplate;
    private Graphics2D myGraphics;
    private final String myCharset;
    private final FontSubstitutionModel mySubstitutions;

    ChartWriter(TimelineChart chart, PdfWriter writer, Document doc, GanttExportSettings exportSettings,
            TTFontCache fontCache, FontSubstitutionModel substitutionModel, String charset) {
        myChart = chart;
        myWriter = writer;
        myDoc = doc;
        myExportSettings = exportSettings;
        myFontCache = fontCache;
        myCharset = charset;
        mySubstitutions = substitutionModel;
    }

    protected ChartModel getModel() {
        return myChart.getModel();
    }
    void write() {
        setupChart(myExportSettings);
        myChart.buildImage(myExportSettings, this);
        myGraphics.dispose();
        myWriter.getDirectContent().addTemplate(myTemplate, myScale, 0, 0, myScale, myDoc.leftMargin(), myYShift);
    }

    private Graphics2D getGraphics(ChartDimensions d) {
        if (myGraphics == null) {
            myTemplate = myWriter.getDirectContent().createTemplate(d.getFullWidth(), d.getChartHeight());
            Rectangle page = myDoc.getPageSize();
            final float width = page.getWidth() - myDoc.leftMargin() - myDoc.rightMargin();
            final float height = page.getHeight() - myDoc.bottomMargin() - myDoc.topMargin();

            final float xscale = width/d.getFullWidth();
            final float yscale = height/d.getChartHeight();
            myScale = Math.min(xscale, yscale);
            myYShift = height - d.getChartHeight() * myScale + myDoc.bottomMargin();
            myGraphics = myTemplate.createGraphics(d.getFullWidth(), d.getChartHeight(),
                    myFontCache.getFontMapper(mySubstitutions, myCharset));
            myGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
        }
        return myGraphics;
    }

    protected void setupChart(GanttExportSettings settings) {
        //myChart.gmyModel.setBounds(myModel.getMaxBounds());
    }

    @Override
    public void acceptLogo(ChartDimensions d, Image logo) {
        Graphics2D g = getGraphics(d);
        g.setBackground(Color.WHITE);
        g.clearRect(0, 0, d.getTreeWidth(), d.getLogoHeight());
        g.drawImage(logo, 0, 0, null);
    }

    @Override
    public void acceptTable(ChartDimensions d, Component header, Component table) {
        Graphics2D g = getGraphics(d);
        g.translate(0, d.getLogoHeight());
        header.print(g);

        g.translate(0, d.getTableHeaderHeight());
        table.print(g);
    }

    @Override
    public void acceptChart(ChartDimensions d, ChartModel model) {
        Graphics2D g = getGraphics(d);
        g.translate(d.getTreeWidth(), - d.getLogoHeight() - d.getTableHeaderHeight());
        model.paint(g);
    }
}